<?php

require_once(__DIR__ . '/WxPayPubHelper.php');
require_once(__DIR__ . '/WxPay.pub.config.php');
require_once(__DIR__ . '/SDKRuntimeException.php');

class WxPayController extends SelfController
{
    public function MachinePay()
    {
        $unifiedOrder = new UnifiedOrder_pub();
        $order_id = Input::get('order_id');
        $order = Order::find($order_id);
        if (!$order) {
            die('no order!');
        }
        if($order->status!=0){
            die('order is payed!');
        }
        //设置统一支付接口参数
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //spbill_create_ip已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $unifiedOrder->setParameter("body", "华丰食堂订餐系统_订单No" . $order_id);//商品描述
        //自定义订单号，此处仅作举例
        $timeStamp = time();
        $out_trade_no = $order_id;
        $unifiedOrder->setParameter("out_trade_no", "$out_trade_no");//商户订单号
        $unifiedOrder->setParameter("total_fee", $order->total_price * 100);//总金额
        $unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL);//通知地址
        $unifiedOrder->setParameter("trade_type", "NATIVE");//交易类型
        //非必填参数，商户可根据实际情况选填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
        //$unifiedOrder->setParameter("device_info","XXXX");//设备号
        //$unifiedOrder->setParameter("attach","XXXX");//附加数据
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
        //$unifiedOrder->setParameter("openid","XXXX");//用户标识
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID

        //获取统一支付接口结果
        $unifiedOrderResult = $unifiedOrder->getResult();

        //商户根据实际情况设置相应的处理流程
        if ($unifiedOrderResult["return_code"] == "FAIL") {
            //商户自行增加处理流程
            echo "通信出错：" . $unifiedOrderResult['return_msg'] . "<br>";
        } elseif ($unifiedOrderResult["result_code"] == "FAIL") {
            //商户自行增加处理流程
            echo "错误代码：" . $unifiedOrderResult['err_code'] . "<br>";
            echo "错误代码描述：" . $unifiedOrderResult['err_code_des'] . "<br>";
        } elseif ($unifiedOrderResult["code_url"] != NULL) {
            //从统一支付接口获取到code_url
            $code_url = $unifiedOrderResult["code_url"];
            //商户自行增加    处理流程
            $img = DNS2D:: getBarcodeHtml($code_url, "QRCODE", 7, 7, "black");
            return View::make(self::$view_path . '.wx_pay', compact('img', 'title', 'links'));
        }


    }

    public function getOrderService()
    {
        if (is_null($this->orderService)) {
            $this->orderService = new SelfOrderService();
        }
        return $this->orderService;
    }
    //异步通知
    public function asyPayResCheck()
    {
        /**
         * 通用通知接口demo
         * ====================================================
         * 支付完成后，微信会把相关支付和用户信息发送到商户设定的通知URL，
         * 商户接收回调信息后，根据需要设定相应的处理流程。
         *
         * 这里举例使用log文件形式记录回调信息。
         */
        //使用通用通知接口
        $notify = new Notify_pub();
        //存储微信的回调
        $xml=file_get_contents("php://input");

        $notify->saveData($xml);


        //验证签名，并回应微信。
        //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
        //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
        //尽可能提高通知的成功率，但微信不保证通知最终能成功。
        if($notify->checkSign() == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回状态码
            $notify->setReturnParameter("return_msg","签名失败");//返回信息
        }else{
            Log::info('SUCCESS。订单ID:'.$notify->data["out_trade_no"]);
            $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
        }
        $returnXml = $notify->returnXml();
        echo $returnXml;

        //==商户根据实际情况设置相应的处理流程，此处仅作举例=======

        //以log文件形式记录回调信息



        if($notify->checkSign() == TRUE)
        {
            if ($notify->data["return_code"] == "FAIL") {
                //此处应该更新一下订单状态，商户自行增删操作
                //Log::info("【通信出错】:\n".$xml."\n");
            }
            elseif($notify->data["result_code"] == "FAIL"){
                //此处应该更新一下订单状态，商户自行增删操作
               // Log::info("【业务出错】:\n".$xml."\n");
            }
            else{
                //此处应该更新一下订单状态，商户自行增删操作
               // Log::info("【支付成功】:\n".$xml."\n");
            }

            if($notify->data["result_code"] == "SUCCESS"){
                $order=Order::find($notify->data["out_trade_no"]);
                if(!$order){echo "fail";die;}
                $order->setPaymentTypes(Order::PAY_TYPE_WECHAT);
                if($order->status==Order::getStatusIDByKeyword(Order::GOT_ORDER)){
                    $order->setStatus(Order::SETTLED);
                }
            }



        }
    }
}